AWS CloudFormationで管理しているAmazon RDSのメジャーアップグレードを実施する
こんにちは。サービスグループの武田です。
AWS CloudFormationで管理しているAmazon RDS for MySQLを5.6から5.7にメジャーアップグレードする機会がありました。アップグレード自体はそこまで手間もなく行えます。
今回は次の2点が前述したエントリと異なり、またハマった箇所でもあります。
- AWS CloudFormationで管理している
- カスタムパラメーターグループを使用している
具体的なハマりポイントと解決策を紹介します。
MySQL 5.6を構築する
まずは移行前のMySQL 5.6を構築するCloudFormationテンプレートを用意します。検証なのでデフォルトVPCを使用しています。実行する場合はSubnetIds
に実在するIDを指定してください。
Resources: DBInstance: Type: AWS::RDS::DBInstance DeletionPolicy: Snapshot Properties: AllocatedStorage: '5' DBInstanceClass: db.t3.medium DBParameterGroupName: !Ref DBParameterGroup DBSubnetGroupName: !Ref DBSubnetGroup Engine: MySQL EngineVersion: 5.6.46 MasterUsername: admin MasterUserPassword: your_secret StorageType: gp2 DBSubnetGroup: Type: AWS::RDS::DBSubnetGroup Properties: DBSubnetGroupDescription: custom subnet group SubnetIds: - subnet-aaaaaaaa - subnet-bbbbbbbb - subnet-cccccccc DBParameterGroup: Type: AWS::RDS::DBParameterGroup Properties: Description: custom paramter group Family: MySQL5.6 Parameters: character_set_database: utf8mb4 character_set_client: utf8mb4 character_set_connection: utf8mb4 character_set_results: utf8mb4 character_set_server: utf8mb4
スタックを作成するとRDSが構築できます。
MySQL 5.7にアップグレードする
RDSのメジャーアップグレードをする際に注意すべき点は次の2点です。
AllowMajorVersionUpgrade=true
プロパティの指定MySQL5.7
Familyのパラメーターグループが必要
1はCloudFormationのドキュメントに記載があります。これを指定し忘れるとアップグレードに失敗します。
2はRDSのドキュメントから引用します。
カスタムパラメータグループを使用する場合は、新しい DB エンジンバージョンで、デフォルトのパラメータグループを指定するか、独自のカスタムパラメータグループを作成します。
もともとデフォルトのパラメーターグループを使用している場合は特に気にする点はありません。一方でカスタムパラメーターグループを使用している場合は、アップグレード後のFamilyで新しいパラメーターグループを用意する必要があります。CloudFormationで管理している場合はどうすればいいでしょうか。
私は始め次のような修正をしてスタックの更新を試みました。
@@ -4,11 +4,12 @@ DeletionPolicy: Snapshot Properties: AllocatedStorage: '5' + AllowMajorVersionUpgrade: true DBInstanceClass: db.t3.medium DBParameterGroupName: !Ref DBParameterGroup DBSubnetGroupName: !Ref DBSubnetGroup Engine: MySQL - EngineVersion: 5.6.46 + EngineVersion: 5.7.28 MasterUsername: admin MasterUserPassword: your_secret StorageType: gp2 @@ -26,7 +27,7 @@ Type: AWS::RDS::DBParameterGroup Properties: Description: custom paramter group - Family: MySQL5.6 + Family: MySQL5.7 Parameters: character_set_database: utf8mb4 character_set_client: utf8mb4
しかしこれは失敗します。スタック更新の理由には次のようなエラーメッセージが出ていました。
The following parameters are not defined for the specified group: offline_mode, max_points_in_geometry, max_digest_length, log_timestamps, max_execution_time, ngram_token_size, performance_schema_max_memory_classes, mecab_rc_file, performance_schema_max_index_stat, performance_schema_max_prepared_statements_instances, performance_schema_max_program_instances, performance_schema_max_table_lock_stat, log_syslog_tag, performance_schema_events_transactions_history_size, performance_schema_events_transactions_history_long_size, mysql_native_password_proxy_users, performance_schema_max_metadata_locks, performance_schema_max_sql_text_length, performance_schema_max_statement_stack, log_syslog_include_pid (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 1a0a07e9-e7c5-447a-940a-ea9f1b834dd2)
このエラーメッセージを見て調べたりしてたのですが、しばらく原因がさっぱりわかりませんでした。原因は、前述したようにFamilyが異なる場合 新しいDBエンジンバージョンで、独自のカスタムパラメーターグループを作成 する必要があるためです。先ほどの修正では、既存のパラメーターグループを更新しようとし、それはできない操作なので失敗してしまいます。
そんなわけで、テンプレートの修正は次のようになりました。名前を変えることによって、新しいパラメーターグループに置き換わります。
@@ -4,11 +4,12 @@ DeletionPolicy: Snapshot Properties: AllocatedStorage: '5' + AllowMajorVersionUpgrade: true DBInstanceClass: db.t3.medium - DBParameterGroupName: !Ref DBParameterGroup + DBParameterGroupName: !Ref DBParameterGroup57 DBSubnetGroupName: !Ref DBSubnetGroup Engine: MySQL - EngineVersion: 5.6.46 + EngineVersion: 5.7.28 MasterUsername: admin MasterUserPassword: your_secret StorageType: gp2 @@ -22,11 +23,11 @@ - subnet-8b9b60c2 - subnet-52d9877a - DBParameterGroup: + DBParameterGroup57: Type: AWS::RDS::DBParameterGroup Properties: Description: custom paramter group - Family: MySQL5.6 + Family: MySQL5.7 Parameters: character_set_database: utf8mb4 character_set_client: utf8mb4
スタックを更新すると問題なく進みます。
20分程度経ち、無事にアップグレードが完了しました。
まとめ
CloudFormationおよびRDSの仕様でわからない部分があり少しハマりました。とはいえ、たったこれだけの変更でDBのアップグレードが完了できてすばらしいですね!どなたかの参考になれば幸いです。